import QtQuick 1.0
import "Components/"
import "Util/Util.js" as Util
import "Util/SettingManager.js" as SettingManager
import "Util/"
import "WebAccess/QMLTwitter/"

Rectangle {
    id: _rootContainer
    width: 360
    height: 600
    color: "#000000"

    // グローバルセッティング
    Setting{
        id: _Setting

        // デバイスに関連する設定（初期設定）
        // 全般
        updateInterval: _Device.updateInterval          // 更新間隔（秒）
        inReplyCountMax: _Device.inReplyCountMax        // 返信元を追いかける回数
        updateCount: _Device.updateCount                // 取得する数
        toFocusTweetButton: _Device.toFocusTweetButton  // ツイートボタンにフォーカスを当てるか
        viewCountMax: _Device.viewCountMax              // 表示する件数の最大値

        //フォントサイズ
        fontPixelSizeTitle: _Device.fontPixelSizeTitle  // タイトル（ユーザー名）
        fontPixelSizeMessage: _Device.fontPixelSizeMessage  //本文（ツイート）
        fontPixelSizeInfomation: _Device.fontPixelSizeInfomation    //情報（時間など）
        fontPixelSizeInputBox: _Device.fontPixelSizeInputBox        // 入力ボックス
        fontPixelSizeRemainCount: _Device.fontPixelSizeRemainCount  // 入力文字残数
        fontPixelSizeTweetButton: _Device.fontPixelSizeTweetButton  // ツイートボタン

        fontPixelSizeContext: _Device.fontPixelSizeContext          // コンテキストメニュー
        fontPixelSizeButton: _Device.fontPixelSizeButton            // ボタン
        fontPixelSizeDlgMessageL: _Device.fontPixelSizeDlgMessageL  // ダイアログメッセージ
        fontPixelSizeDlgMessageM: _Device.fontPixelSizeDlgMessageM  // ダイアログメッセージ
        fontPixelSizeDlgMessageS: _Device.fontPixelSizeDlgMessageS  // ダイアログメッセージ

        //ロード完了
        Component.onCompleted: {
            Util.outputDebugString("onCompleted Setting");

            //設定などのロード
            loadContent();
        }

        //閉じる時
        Component.onDestruction: {
            Util.outputDebugString("onDestruction Setting");

            //ウインドウサイズ調節
            _Setting.windowWidth = _rootContainer.width;
            _Setting.windowHeight = _rootContainer.height;
            // 設定保存
            _Setting.save();

            Util.outputDebugString("onDestruction Setting saved");
        }
    }

    //Twitter関連の設定
    TwitterSetting{
        id: _twitterSetting

        property string consumerSecret: _Device.consumerSecret
        property string consumerKey: _Device.consumerKey

    }

    //アイテムをクリックしてメニューだして何か処理させる時の情報を保存する
    Item{
        id: _selectItemInfo

        property string itemId: ""      //主にステータスID入れるのに使う
        property string screenName: ""  //screen nameの保存
        property string message: ""     //本文
        property bool isFavorite: false //お気に入り
        property bool isFollow: false   //フォローしているか

//        property variant item: null      //デリゲートそのもの
        property variant container: null    //選択しているコンテナ

        property string listId: ""      //listの内容を表示する時のID
        property string listName: ""    //listの名前

        property int mouse_x: -1         //マウスがクリックした場所
        property int mouse_y: -1         //マウスがクリックした場所

        //使ったらクリアする
        function clear(){
            itemId = "";
            screenName = "";
            message = "";
            isFavorite = false;
            isFollow = false;
            container = null;
//            mouse_x = -1; // ここで消すと消える時に位置が移動するのでダメ
//            mouse_y = -1;
//            item = null;
        }
    }


    // 設定やツイッター情報や各種ローダー系操作
    function loadContent(){
        // 設定ロード
        _Setting.load();
        // ついったー設定ロード
        _twitterSetting.load();

        // コンテンツエリアをロード
        _repeaterContent.model.clear();
        _lineTab.clear();
        for(var i=0; i<_twitterSetting.count(); i++){
            // 本体をロード
            _repeaterContent.model.append({_id: _componentContent});
            // タブを追加
            _lineTab.append("@" + _twitterSetting.get(i).screen_name);
        }

        //メニューとかをロード
        _loaderMenu.sourceComponent = _componentMenu;
        _loaderDialog.sourceComponent = _componentDialog;

        //ウインドウサイズ調節
        if(!_Device.isMobile){
            _rootContainer.width = _Setting.windowWidth;
            _rootContainer.height = _Setting.windowHeight;
        }

        Util.outputDebugString(">> Debug Infomation --------------------------");
        Util.outputDebugString("density=" + _Device.density);
        Util.outputDebugString("width=" + _Setting.windowWidth
                               + ",height=" + _Setting.windowHeight);
        Util.outputDebugString("max=" + LayoutItem.maximumSize
                               + ",min=" + LayoutItem.minimumSize
                               + ",pref=" + LayoutItem.preferredSize);
        Util.outputDebugString(">> Debug Infomation --------------------------");
    }

    // 現在のアクティブなラインを取得する
    function getActiveLine(){
        if(_repeaterContent.itemAt(_repeaterContent.currentId) === null){
            return null;
        }else{
            return _repeaterContent.itemAt(_repeaterContent.currentId).item;
        }
    }


    // 次のラインへフォーカスを当てる
//    function setNextFocusLine(current){
//        if(current >= (_repeaterContent.count - 1)){
//            // 最後は最初へ
//            _repeaterContent.itemAt(0).item.content.setFocusActiveListView();
//            _repeaterContent.currentId = 0;
//        }else{
//            for(var i=0; i<_repeaterContent.count; i++){
////                console.debug("focus:" + _repeaterContent.itemAt(i).item.content.getActiveListViewObject().activeFocus);
//                if(i === (current + 1)){
//                    _repeaterContent.itemAt(i).item.content.setFocusActiveListView();
//                    _repeaterContent.currentId = i;
//                }
//            }
//        }
//    }
    function setNextFocusLine(current, increment){
        if(increment){
            current++;
        }else{
            current--;
        }
        if(current >= _repeaterContent.count){
            // 最後は最初へ
            _repeaterContent.itemAt(0).item.content.setFocusActiveListView();
            _repeaterContent.currentId = 0;
        }else if(current < 0){
            // 最初は最後へ
            _repeaterContent.itemAt(_repeaterContent.count - 1).item.content.setFocusActiveListView();
            _repeaterContent.currentId = _repeaterContent.count - 1;
        }else{
            for(var i=0; i<_repeaterContent.count; i++){
//                console.debug("focus:" + _repeaterContent.itemAt(i).item.content.getActiveListViewObject().activeFocus);
                if(i === current){
                    _repeaterContent.itemAt(i).item.content.setFocusActiveListView();
                    _repeaterContent.currentId = i;
                }
            }
        }
    }


    // フォーカスの移動を受ける
    function setFocusLine(current){
        _repeaterContent.currentId = current;
    }

    // 0 -> 1 : コンテンツ -> Edit
    // 1 -> 2 : Edit -> ボタン
    // 2 -> 0 : ボタン -> コンテンツ
    function setNextFocus(current, increment){
        getActiveLine().setNextFocus(current, increment);
    }
    // 入力へフォーカスを当てる
    function setFocusTextEdit(is){
        getActiveLine().setFocusTextEdit(is);
    }

    // ツイートコンテナを開閉する
    function openTweetContainer(is_open){
        getActiveLine().openTweetContainer(is_open);
    }
    // ツイートコンテナが開いてるか
    function isOpenTweetContainer(){
        return getActiveLine().isOpenTweetContainer();
    }

    // 検索コンテナを開閉する
    function openSearchContainer(is_open){
       getActiveLine().openSearchContainer(is_open);
    }
    // 検索コンテナが開いてるか
    function isOpenSearchContainer(){
        return getActiveLine().isOpenSearchContainer();
    }



    //壁紙
    Image {
        id: _wallpaper
        anchors.fill: parent
        source: _Setting.wallpaperPath
        fillMode: Image.PreserveAspectCrop
        clip: true
        smooth: true
    }

    //アクションバーの管理
    ActionBar {
        id: _actionBar
        anchors.left: _rootContainer.left
        anchors.top: _rootContainer.top
        width: _rootContainer.width
        density: _Device.density

        //くるくる回す
//        loading: _contentContainer.loading

//        MouseArea {
//            anchors.fill: parent

//            onClicked: {
//                _toast.show("homhom");
//            }
//        }
    }



    //実際の内容を表示する
    Row{
        id: _rowContent
        x: _Device.isMobile ? (-1 * _repeaterContent.currentId * _rootContainer.width) : 0
        anchors.top: _actionBar.bottom
        anchors.bottom: _lineTab.top
        Repeater{
            id:_repeaterContent
            property int currentId: -1  // 現在アクティブラインのID
            model: ListModel {
            }
            Loader{
                id: _loaderContent
                sourceComponent: _id
//                source: _id
                width: _Device.isMobile ? _rootContainer.width : (_rootContainer.width / (_repeaterContent.count < 1 ? 1 : _repeaterContent.count))
                height: _rowContent.height
                onLoaded: {
//                    console.debug("loaded," +  _rootContainer.width + "," + _rowContent.height
//                                  + ",index=" + index);
                    // 最初だけ
                    if(index === 0){
                        // 最初のラインがロードされた時だけ
                        //フォーカス移動
                        _loaderContent.item.setFocusTextEdit(false);
                        // 現在のラインのID
                        _repeaterContent.currentId = index;
                        // タブをクリア
                        _lineTab.clear();
                    }
                    // 自分を識別するID
                    _loaderContent.item.containerId = index;
                    // twitterのアカウント設定を登録
                    _loaderContent.item.setTwitterSetting(_twitterSetting.consumerKey, _twitterSetting.consumerSecret
                                                          , _twitterSetting.get(index).token
                                                          , _twitterSetting.get(index).token_secret
                                                          , _twitterSetting.get(index).screen_name
                                                          , _twitterSetting.get(index).user_id)
                }
            }
            onCurrentIdChanged: {
                if(getActiveLine() === null){
                    _actionBar.appState = "Home";
                }else{
                    _actionBar.appState = getActiveLine().content.title;
                }
            }
        }
        Behavior on x {
            NumberAnimation { duration: 200 }
        }
    }
    Component{
        id: _componentContent
        LineContainer{
            // ラインの実体
            onLineFocusChanged: {
                // ラインのフォーカスが変更された
                setFocusLine(current);
            }
            onNextFocusLine: {
                // ラインのフォーカスを移動する
                setNextFocusLine(current, increment);
            }
            onNextFocus: {
                // リストとエディットとボタンのフォーカス移動
                // それぞれでやってるので何もしない
            }
            onLineTitleChanged: {
                // タイトルの変更
                _actionBar.appState = title;
            }
        }
    }

    // ライン切り替えのタブ
    LineTab{
        id: _lineTab
        density: _Device.density
        index: _repeaterContent.currentId
        count: _repeaterContent.count
        color: _Setting.lineTabBaseColor
        colorTab: _Setting.lineTabColor
        opacity: _Setting.lineTabOpacity
        fontColor: _Setting.lineTabFontColor
        fontStyle: _Setting.lineTabFontStyle
        fontStyleColor: _Setting.lineTabFontStyleColor
        fontPixelSize: _Setting.lineTabFontSize

        onTabClicked: {
            setNextFocusLine(index - 1, true);
        }
    }

    // 前面に表示するダイアログのステーと管理
    property alias _dialogContainer: _loaderDialog.item
    Loader{
        id: _loaderDialog
        anchors.fill: parent

        onLoaded: {
            //認証情報の確認
            if(_twitterSetting.check()){
                //更新
//                _contentContainer.update();
            }else{
                //Auth
                _dialogContainer.open("Account");
            }
        }
    }
    Component{
        id: _componentDialog
        DialogContainer {
            anchors.fill: parent
            density: _Device.density
            referenceWidth: _Device.isMobile ? _rootContainer.width : (_rootContainer.width / (_repeaterContent.count < 1 ? 1 : _repeaterContent.count))
        }
    }

    //全面に表示するメニューのステート管理
    property alias _menuContainer: _loaderMenu.item
    Loader{
        id: _loaderMenu
        anchors.fill: parent

        onLoaded: {
        }
    }
    Component{
        id: _componentMenu
        MenuContainer {
            anchors.fill: parent
            density: _Device.density
        }
    }


    //Anroidのトースト的なもの
    Toast{
        id: _toast

        x: (_rootContainer.width / 2 - width / 2)
        y: (_rootContainer.height / 2 - height / 2)
        density: _Device.density
    }



}
